package cn.sys.dao;

import cn.sys.controller.dto.SearchDTO;
import cn.sys.entity.Student;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;
import java.util.Map;

public interface StudentDao {
    /**
     * 根据用户名和密码查询出用户信息
     */
    Student findStudentByNameAndPassword(@Param("studentName") String studentName, @Param("password") String password);

    /**
     * 根据用户名或电话查询用户信息
     */
    Student findStudentByNameOrPhone(String studentNameOrPhone);

    /**
     * 修改用户密码
     */
    int updatePassword(@Param("newPassword") String newPassword,@Param("stuId") int stuId);

    /**
     * 修改用户个人信息
     */
    int updateStudentInfo(Student student);

    /**
     * 个人信息修改时的用户名和手机号验重
     */
    Student findOtherStudentByNameOrPhone(@Param("phoneNum") String phoneNum,@Param("stuName") String studentName, @Param("stuId") int stuId);

    /**
     * 登录成功时，将验证次数置为0，并修改登录时间
     */
    int updateLoginCountAndLoginTime(@Param("loginTime") Date loginTime,@Param("stuId") int stuId);

    /**
     * 登录失败时，记录登录失败次数+1
     */
    int addLoginCountByName(String stuName);

    /**
     * 根据用户名查询用户是否冻结
     */
    int findStudentLockState(@Param("stuName") String stuName);

    /**
     * 查询用户登录失败的次数
     */
    Integer findFailCount(@Param("stuName") String stuName);

    /**
     * 将账号冻结，并修改冻结时间
     */
    int updateStudentLockState(@Param("stuName") String stuName, @Param("lockState") int lockState, @Param("lockTime") Date lockTime);

    /**
     * 添加学员
     */
    int addStudent(Student student);

    /**
     * 添加学员时的用户名和手机号验重
     */
    Student findStudentByNameAndPhone(@Param("phoneNum") String phoneNum,@Param("stuName") String studentName);

    /**
     * 根据学员Id查询信息
     */
    Student findStudentById(Integer stuId);

    /**
     * 批量插入学生数据
     */
    int addStudentList(@Param("students") List<Map<String, Object>> students);

    /**
     * 查询学生信息，以及对应的宿舍信息、宿舍位置信息
     */
    List<Map<String, Object>> findStudentAndDormitoryAndPosition(SearchDTO searchDTO);

    /**
     * 查询学生信息
     */
    Student findStudentByStuIdAndPhoneNum(@Param("stuId") Integer stuId, @Param("phoneNum") String phoneNum);

    /**
     * 修改学员锁定状态、失败登录次数、密码
     */
    int updateStudentLockStateAndFailCountAndPassword(@Param("stuId") Integer stuId);

    /**
     * 根据寝室id查询学生列表
     */
    List<Map<String, Object>> findStuDormitoryByDorId(Integer dorId);

}
